﻿/*
汽车从起点出发驶向目的地，该目的地位于出发位置东面 target 英里处。

沿途有加油站，用数组 stations 表示。其中 stations[i] = [positioni, fueli] 表示第 i 个加油站位于出发位置东面 positioni 英里处，并且有 fueli 升汽油。

假设汽车油箱的容量是无限的，其中最初有 startFuel 升燃料。它每行驶 1 英里就会用掉 1 升汽油。当汽车到达加油站时，它可能停下来加油，将所有汽油从加油站转移到汽车中。

为了到达目的地，汽车所必要的最低加油次数是多少？如果无法到达目的地，则返回 -1 。

注意：如果汽车到达加油站时剩余燃料为 0，它仍然可以在那里加油。如果汽车到达目的地时剩余燃料为 0，仍然认为它已经到达目的地。

https://leetcode.cn/problems/minimum-number-of-refueling-stops/description/?envType=daily-question&envId=2024-10-07
*/

#include <iostream>
#include <string>
#include <vector>
#include <list>
#include "TreeNode.hpp"
#include "ListNode.hpp"
#include <map>
#include <set>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <functional>

using namespace std;


class Solution {
public:
    // 核心思路：尽量往前走，如果走不动了，就从后备能源中抽一桶最大的
    int minRefuelStops(int target, int fuel, vector<vector<int>>& stations) {
        priority_queue<int, vector<int>, less<int>> hp;
        int i = 0;

        stations.push_back({ target, 0 });
        int n = stations.size();
        while (i < n) {
            // 尝试往前走
            while (i < n && stations[i][0] <= fuel) {
                hp.push(stations[i][1]);                // 积累油桶
                i++;
            }

            if (hp.empty())     return -1;
            if (i < n) {
                fuel += hp.top();
                hp.pop();
            }
        }

        return stations.size() - hp.size();
    }

};